package com.mmall.concurrency.example.atomic;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

import com.mmall.concurrency.annoations.ThreadSafe;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@ThreadSafe
public class AtomicExample3 {
	
	// 请求总数
	public static int clientTotal = 1000;
	// 同事并发执行的线程数
	public static int threadTotal = 50;
	
	public static AtomicLong count = new AtomicLong(0);
	
	public static void main(String args[]) throws InterruptedException {
		ExecutorService executorService = Executors.newCachedThreadPool();
		Semaphore semaphore = new Semaphore(threadTotal);
		CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
		for(int i=0; i<clientTotal; i++) {
			executorService.execute(()->{
				try {
					semaphore.acquire();
					add();
					semaphore.release();
				}catch (Exception e) {
					log.warn("exception",e);
				}
			});
			countDownLatch.countDown();
		}
		countDownLatch.await();
		executorService.shutdown();
		log.info("count:{}",count);
	}

	private static void add() {
		count.incrementAndGet();  
		//count.getAndIncrement();
	}
}
